//
//  main.c
//  Questions
//
//  Created by wangrui on 14-09-18.
//  Copyright (c) 2014年 PPS. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>

void printArray(int a[], int count)
{
	for (int k=0; k<count; k++) {
		printf("%d ",a[k]);
	}
	
	printf("\n");
}

void swap(int *a, int  *b)
{
	int t = *a;
	*a = *b;
	*b = t;
}

/*
 *迷宫问题
 *输入n,m 表示n行，m列
 *接下来输入n行m列迷宫，1 表示障碍，0 表示空地
 *最后一列输入4个数，入口的x坐标，y坐标，目的x坐标, 目的y坐标
 *
 *eg:
 *
 *in:
 *5 4
 *0 0 1 0
 *0 0 0 0
 *0 0 1 0
 *0 1 0 0
 *0 0 0 1
 *1 1 4 3
 *
 *out: 7
 *
 *可利用图的方法来解决，把每个元素构想成一个点，深度遍历每一个点
 *
 */

struct Coordinate{
	int x,y;
};

struct Coordinate records[50];


int values[50][50]; int boxFlags[50][50];
int n,m,p,q;
int minSteps = 99999999;
int next[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};

void dfs(int x, int y, int step) //返回是否找到
{
	if (x==p && y==q) {
		if (minSteps > step) {
			minSteps = step;
		}
		
		//打印路径(boxFlags 里虽然标记了走了哪些点，但是没有走的顺序，所以要新的数组记录)
		for (int i = 0; i<=step; i++) {
			printf(" (%d,%d)->",records[i].x,records[i].y);
		}
		
		printf("end\n");
		
		return ;
	}
		
	for (int i=0; i<4; i++) { //上下左右
		
		int tx = x + next[i][0];
		int ty = y + next[i][1];
		
		if (tx > m-1 || tx < 0 || ty > n-1 || ty < 0) {
			continue;
		}
		
		if (boxFlags[tx][ty] == 0 && values[tx][ty] == 0) {//未走过且无障碍
			
			boxFlags[tx][ty] = 1;
			records[step+1].x = tx;
			records[step+1].y = ty;
			
			dfs(tx, ty, step+1);
			boxFlags[tx][ty] = 0;
		}
	}
}

int main(int argc, const char * argv[])
{
	scanf("%d %d",&n,&m);
	
	for (int i=0; i<n; i++) {
		for (int j=0; j<m; j++) {
			scanf("%d",&values[i][j]);
		}
	}
	
	int startX,startY;
	scanf("%d %d %d %d",&startX,&startY,&p,&q);
	
	boxFlags[startX][startY] = 1;
	records[0].x = startX;
	records[0].y = startY;
	
	dfs(startX,startY,0);
	
	printf("\n min steps:%d\n",minSteps);
	
	return 0;
}


